/*
 *@Type RandomAccessFileUtil.java
 * @Desc
 * @Author urmsone urmsone@163.com
 * @date 2024/6/13 02:58
 * @version
 */
package utils;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;

public class RandomAccessFileUtil {

    private static final String RW_MODE = "rw";

    /**
     * 将给定的字节数组写入指定的文件。
     *
     * @param filePath 要写入的文件路径
     * @param value 要写入的字节数组
     * @return 写入后文件的长度
     */
    public static int write(String filePath, byte[] value) {
        RandomAccessFile file = null;
        long len = -1L;
        try {
            // 以读写模式打开文件
            file = new RandomAccessFile(filePath, RW_MODE);
            // 获取文件当前的长度
            len = file.length();
            // 将文件指针移动到文件末尾
            file.seek(len);
            // 将字节数组写入文件
            file.write(value);
            // 关闭文件
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 返回写入后文件的长度
        return (int)len;
    }

    /**
     * 将给定的整数值写入指定的文件。
     *
     * @param filePath 要写入的文件路径
     * @param value 要写入的整数值
     */
    public static void writeInt(String filePath, int value) {
        RandomAccessFile file = null;
        long len = -1L;
        try {
            // 以读写模式打开文件
            file = new RandomAccessFile(filePath, RW_MODE);
            // 获取文件当前的长度
            len = file.length();
            // 将文件指针移动到文件末尾
            file.seek(len);
            // 将整数值写入文件
            file.writeInt(value);
            // 关闭文件
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从指定的文件位置读取指定长度的字节数组。
     *
     * @param filePath 要读取的文件路径
     * @param index 要读取的文件位置
     * @param len 要读取的长度
     * @return 读取的字节数组
     */
    public static byte[] readByIndex(String filePath, int index, int len) {
        RandomAccessFile file = null;
        byte[] res = new byte[len];
        try {
            // 以读写模式打开文件
            file = new RandomAccessFile(filePath, RW_MODE);
            // 将文件指针移动到指定位置
            file.seek((long)index);
            // 读取指定长度的字节数组
            file.read(res, 0, len);
            // 返回读取的字节数组
            return res;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 无论是否发生异常,都要关闭文件
                file.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 如果发生异常,返回null
        return null;
    }

}
